# 1、引用计数（引用机制）
#     python引用计数：每个对象都有存在指向该对象的引用总数，即引用计数
#     每个对象维护一个 ob_ref 字段，用来记录该对象当前被引用的次数
#     每当新的引用指向该对象时，它的引用计数ob_ref加1（当有新的引用指向的时候，引用计数加1）
#     每当该对象的引用失效时，计数ob_ref减1（当有无效的引用计数发生的时候，引用计数-1）
#     一旦对象的引用计数为0，该对象可以被回收，对象占用的内存空间将被释放。（当对象的引用计数为0时，销毁对象）
#     getrefcount（）：引用计数值，计数的值比真正引用的值多一个，getrefcount在临时应用时，引用计数会+1，比实际计数多一个（容器类型存放的都是引用）
# 2、垃圾回收：回收原则：当Python的某个对象的引用计数降为0时，可以被垃圾回收
# 三种情况会触发垃圾回收：
#     调用gc.collect()：
#     GC达到阀值时（700）
#     程序退出
# 分代回收：大大提高了垃圾回收的效率
#     存活时间越久的对象，越不可能在后面的程序中变成垃圾
#     python将所有的对象分为0，1，2三代
#     所有新建对象都是0代对象
#     当某一代垃圾经历过垃圾回收，依然存活，那么他就被归为下一代对象
# 标记清除：（清除机制），首先标记对象（垃圾检测），然后清除垃圾（垃圾回收）。主要用于解决循环引用
# 3、内存池机制
#     python缓冲池（只有缓冲池不同变量才会指向同一个对象）
#     整数对象缓冲池：对于[-5,256] 这样的小整数，系统已经初始化好，可以直接拿来用。
#     而对于其他的大整数，系统则提前申请了一块内存空间，等需要的时候在这上面创建大整数对象。
#     字符串缓存：为了检验两个引用指向同一个对象，我们可以用is关键字。
#     is用于判断两个引用所指的对象是否相同。当触发缓存机制时，只是创造了新的引用，而不是对象本身